package com.self.springframework.aop.framework;

import org.aopalliance.intercept.MethodInvocation;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;

/**
 * 它负责按顺序执行AOP拦截器链,并最终调用目标方法
 * 管理拦截器链: 存储并以此执行MethodInterceptor列表
 * 方法调用上下文: 封装目标方法、参数、目标对象等信息
 * 责任链模式: 支持拦截器的嵌套调用(proceed()机制)
 */
public class ReflectiveMethodInvocation implements MethodInvocation {
    // 目标对象
    protected final Object target;
    // 方法
    protected final Method method;
    // 入参
    protected final Object[] arguments;

    public ReflectiveMethodInvocation(Object target, Method method, Object[] arguments) {
        this.target = target;
        this.method = method;
        this.arguments = arguments;
    }

    /**
     * 获取当前点用的方法
     */
    @Override
    public Method getMethod() {
        return this.method;
    }

    /**
     * 获取方法参数
     */
    @Override
    public Object[] getArguments() {
        return this.arguments;
    }

    /**
     * 执行下一个拦截器或者目标方法
     */
    @Override
    public Object proceed() throws Throwable {
        System.out.println("3.责任链模式拦截器嵌套调用此方法:  proceed()");
        return method.invoke(target,arguments);
    }

    /**
     * 获取代理对象
     */
    @Override
    public Object getThis() {
        return target;
    }

    /**
     * 直译 - 获取静态部分
     * 获取方法签名(Method对象)
     */
    @Override
    public AccessibleObject getStaticPart() {
        return this.method;
    }
}
